#include <stdio.h>
#include <string.h> //字符串处理库

int main()
{
#if 0
    //strlen：计算字符串长度（不计算'\0'）
    char s[] = "helloworld";
    printf("%ld\n", strlen(s)); //计算以s为首地址的字符串长度，到'\0'为止，不计算'\0'
    printf("%ld\n", sizeof(s)); //对于字符数组来说，如果是一个刚刚好的字符串塞入的话，它的sizeof比strlen始终多计算一个'\0'
#endif

#if 0
    /*strcmp：字符串比较（比较每个位置上字符的ASCII码值）      
        >0  前比后大
        =0  字符串相等
        <0  前比后小*/
    char s1[] = "hella";
    char s2[] = "hel";
    printf("%d\n", strcmp(s1, s2)); //当两个字符串在某个位置的字符不同或其中一个字符串结束时，比较就停止了
#endif

#if 0
    //strncmp：比较n个字符
    char s1[] = "hello";
    char s2[] = "helloworld";
    printf("%d\n", strncmp(s1, s2, 5));
#endif

#if 0
    //strcpy：字符串拷贝（不安全 可能会越界）
    char s1[] = "hello";    //拷贝字符串时，'\0'不用拷
    char s2[3] = {0};       //拷贝过来会越界
    strcpy(s2, s1);
    printf("%s\n", s2);
#endif

#if 0
    //strncpy：
    char s1[] = "hello";
    char s2[3] = {0};
    strncpy(s2, s1, sizeof(s2)-1);    //得留个位置给'\0'，避免要拷贝到的位置的后面内存是用过的，可能会有垃圾值，到时候输出，字符串后面就会跟上垃圾值，所以要-1
    printf("%s\n", s2);
#endif

#if 0
    //strcat：字符串拼接（不安全 可能会越界）
    char s1[11] = "hello";  //确保数组足够大，能放得下要追加的字符串
    char s2[] = "world";
    strcat(s1, s2);
    printf("%s\n", s1);
#endif

#if 0
    //strncat：
    char s1[9] = "hello";
    char s2[] = "world";
    strncat(s1, s2, sizeof(s1)-1-strlen(s1));
    printf("%s\n", s1);
#endif

#if 0
    //strstr：字符串查找
    char s1[] = "helloworld";
    char s2[] = "llo";
    char * dest = strstr(s1, s2);
    //如果没找到 返回空指针
    if(dest == NULL)
    {
        printf("未找到匹配的子串\n");
    }
    else
    {
        printf("%s\n", dest);
    }
#endif

#if 0
    //strtok：字符串切割
    char s[] = "jack,andy,jue";
    //返回切割下来的第一段字符串
    char *dest = strtok(s, ",");
    printf("%s\n", dest);

    //继续切割之前的字符串，传入NULL（返回的结果是一个指向切割出来的子字符串的指针，并且在原始字符串 s 中会用 '\0' 替换掉第一个分隔符，以标记切割的位置，方便后面继续切割时从上一次切割结束标记的位置开始）
    dest = strtok(NULL, ",");
    printf("%s\n", dest);

    //再切
    dest = strtok(NULL, ",");
    printf("%s\n", dest);

    //一个字符串不能再切割，返回空指针
    dest = strtok(NULL, ",");
    if(dest == NULL)
    {
        printf("指针为空！\n");
    }
    printf("%s\n", dest);
#endif

#if 0
    //把字符串切割写成通用型：
    char s[] = "jack,andy!jue";
    char *dest = strtok(s, ",!.");  //分隔符的集合
    while(dest != NULL)
    {
        printf("%s\n", dest);
        dest = strtok(NULL, ",!.");
    }
#endif
    
#if 1
    //strtok切割的本质就是把想要切割的字符变成'\0'
    //所以这个函数最大的问题就是会修改原字符串，是不可逆的，所以必须先进行原字符串拷贝
    char s[] = "jack,andy,jue";
    char *dest = strtok(s, ",");

    for(int i = 0; i < sizeof(s); i++)
    {
        printf("%c %d\n", s[i]);
    }
#endif
    return 0;
}